def compose(h, g):
    return lambda x : g(h(x))


class HiRange(object):
    """
    一个模拟 Python 内置 range() 的类，使用 __iter__ 和 __next__ 实现。
    """

    def __init__(self, start, stop=None, _step=1):
        """
        初始化 HiRange 对象。

        参数:
            start: 起始值（包含）。如果 stop 为 None，则 start 被视为 stop，起始值变为 0。
            stop:  结束值（不包含）。
            _step:  步长，必须不为 0。
        """
        # 处理参数：如果只传了一个参数，则它作为 stop，start 默认为 0
        super(HiRange, self).__init__()

        if stop is None:
            self.stop = start
            self.start = 0
        else:
            self.start = start
            self.stop = stop

        self._step = _step

        # 验证 _step
        if self._step == 0:
            raise ValueError("HiRange() _step argument must not be zero")

        # 初始化迭代状态（在 __iter__ 中重置，但在这里声明以便理解）
        # self.current 将在 __iter__ 中设置

    def __iter__(self):
        """
        返回一个迭代器对象。对于这个类，迭代器就是实例本身。
        每次调用 __iter__ 都会重置迭代状态，使得 HiRange 对象可以被多次迭代。
        """
        # 创建一个新的迭代器实例，或者重置当前实例的状态
        # 这里选择重置当前实例的状态，使其成为自己的迭代器
        self.current = self.start
        return self  # 返回自己，因为这个类也实现了 __next__

    def __next__(self):
        """
        返回序列中的下一个值。
        当没有更多项目要返回时，引发 StopIteration 异常。
        """
        # 检查是否应该继续生成下一个值
        # 根据 _step 的正负，决定循环条件
        if self._step > 0:
            if self.current >= self.stop:
                raise StopIteration
        else: # self._step < 0
            if self.current <= self.stop:
                raise StopIteration

        # 保存当前值准备返回
        value = self.current
        # 更新 current 为下一个值
        self.current += self._step
        return value

    def __repr__(self):
        """提供一个友好的字符串表示。"""
        if self.start == 0 and self._step == 1:
            return f"HiRange({self.stop})"
        elif self._step == 1:
            return f"HiRange({self.start}, {self.stop})"
        else:
            return f"HiRange({self.start}, {self.stop}, {self._step})"

    def step(self, c):
        self._step = c
        return self

import os
import sys
from contextlib import redirect_stdout

# 使用上下文管理器临时关闭 stdout
with open(os.devnull, 'w') as devnull:
    with redirect_stdout(devnull):
        import pygame

def drawRect(x, y, width, height, color, win):
    pygame.draw.rect(win.screen, color, (x, y, width, height))
    return win

def drawLine(x1, y1, x2, y2, color, win):
    pygame.draw.line(win.screen, color, (x1, y1), (x2, y2))
    return win

def drawCircle(x, y, r, color, win):
    pygame.draw.circle(win.screen, color, (x, y), r)
    return win

def delaySystem(delay):
    pygame.time.delay(delay)

def updateScreen(win):
    pygame.display.update()
    return win

class HiScreen(object):
    def __init__(self, width, height):
        self.width = width
        self.height = height
        self.screen = pygame.display.set_mode((width, height))
        pygame.display.set_caption("muLang")
        self.actions = {}

    def fill(self, color):
        self.screen.fill(color)

    def update(self):
        pass

    def add_action(self, message, action):
        self.actions[message] = action
    
    def run(self, func):
        going = True
        while going:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    going = False
                if event.type == pygame.MOUSEBUTTONDOWN:
                    self.actions["MOUSE_DOWN"](self, event.pos)
                
            func(self)
            pygame.display.update()
            pygame.time.delay(30)
